#!/usr/bin/env python3
"""
用户自定义参数管理器
负责管理用户自定义的参数，将其保存为Python模块供脚本引用
"""

import os
import json
import ast
import logging
from pathlib import Path

class UserParametersManager:
    """
    用户自定义参数管理器
    负责管理用户自定义的参数，将其保存为Python模块供脚本引用
    每个用户的参数单独存储，互相隔离
    """
    
    def __init__(self, base_dir=None):
        """
        初始化参数管理器
        
        Args:
            base_dir: 项目根目录，如果为None则使用当前目录的上级目录
        """
        if base_dir is None:
            # 获取当前文件所在目录的上级目录作为项目根目录
            base_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
        
        self.base_dir = base_dir
        self.parameters_dir = os.path.join(base_dir, 'user_parameters')
        
        # 确保主目录存在
        os.makedirs(self.parameters_dir, exist_ok=True)
        
        # 创建一个空的README文件，说明目录用途
        readme_file = os.path.join(self.parameters_dir, 'README.md')
        if not os.path.exists(readme_file):
            with open(readme_file, 'w', encoding='utf-8') as f:
                f.write('# 用户自定义参数\n\n此目录存储用户自定义的参数，供脚本引用。\n\n**请勿手动修改此目录中的文件，应通过Web界面管理参数。**\n\n## 使用方法\n\n在脚本中可以通过以下方式引用参数：\n\n```python\n# 引入特定用户的参数\nfrom user_parameters.用户名 import 参数名\n\n# 示例\nfrom user_parameters.admin import database_host\n```')
        
        # 确保__init__.py文件存在，用于导入用户模块
        init_file = os.path.join(self.parameters_dir, '__init__.py')
        if not os.path.exists(init_file):
            with open(init_file, 'w', encoding='utf-8') as f:
                f.write('#!/usr/bin/env python3\n"""\n用户自定义参数包\n此文件由系统自动生成，请勿手动修改\n"""\n\n# 此文件允许从user_parameters包中导入用户模块\n')
    
    def _get_user_dir(self, username):
        """
        获取用户参数目录
        
        Args:
            username: 用户名
            
        Returns:
            str: 用户参数目录路径
        """
        user_dir = os.path.join(self.parameters_dir, username)
        os.makedirs(user_dir, exist_ok=True)
        
        # 确保用户目录下有__init__.py文件
        init_file = os.path.join(user_dir, '__init__.py')
        if not os.path.exists(init_file):
            with open(init_file, 'w', encoding='utf-8') as f:
                f.write(f'#!/usr/bin/env python3\n"""\n{username}的自定义参数模块\n此文件由系统自动生成，请勿手动修改\n"""\n\n')
        
        return user_dir
    
    def get_all_parameters(self, username=None):
        """
        获取所有参数
        
        Args:
            username: 用户名，如果为None则返回所有用户的参数
            
        Returns:
            dict: 参数字典，键为参数名，值为参数值
        """
        if username is None:
            # 如果未指定用户名，返回所有用户的参数（仅用于管理员查看）
            all_parameters = {}
            for user_dir in os.listdir(self.parameters_dir):
                user_path = os.path.join(self.parameters_dir, user_dir)
                if os.path.isdir(user_path) and not user_dir.startswith('__'):
                    params_file = os.path.join(user_path, 'parameters.json')
                    if os.path.exists(params_file):
                        try:
                            with open(params_file, 'r', encoding='utf-8') as f:
                                all_parameters[user_dir] = json.load(f)
                        except Exception as e:
                            logging.error(f"读取用户{user_dir}参数文件失败: {e}")
            return all_parameters
        else:
            # 获取指定用户的参数
            user_dir = self._get_user_dir(username)
            params_file = os.path.join(user_dir, 'parameters.json')
            
            if not os.path.exists(params_file):
                with open(params_file, 'w', encoding='utf-8') as f:
                    json.dump({}, f)
                return {}
            
            try:
                with open(params_file, 'r', encoding='utf-8') as f:
                    return json.load(f)
            except Exception as e:
                logging.error(f"读取用户{username}参数文件失败: {e}")
                return {}
    
    def add_parameter(self, key, value, username):
        """
        添加或更新参数
        
        Args:
            key: 参数名
            value: 参数值
            username: 用户名
            
        Returns:
            tuple: (成功标志, 消息)
        """
        # 验证参数名是否合法（只允许字母、数字和下划线）
        if not key.isidentifier():
            return False, "参数名只能包含字母、数字和下划线，且不能以数字开头"
        
        # 尝试将字符串值转换为适当的Python数据类型
        try:
            # 尝试解析为Python字面量
            parsed_value = ast.literal_eval(value)
        except (ValueError, SyntaxError):
            # 如果解析失败，保留为字符串
            parsed_value = value
        
        # 获取用户目录
        user_dir = self._get_user_dir(username)
        params_file = os.path.join(user_dir, 'parameters.json')
        
        # 读取现有参数
        parameters = self.get_all_parameters(username)
        
        # 添加或更新参数
        parameters[key] = parsed_value
        
        # 保存参数
        try:
            with open(params_file, 'w', encoding='utf-8') as f:
                json.dump(parameters, f, ensure_ascii=False, indent=2)
            
            # 生成模块文件
            self._generate_module(parameters, username)
            
            return True, "参数添加成功"
        except Exception as e:
            logging.error(f"保存用户{username}参数失败: {e}")
            return False, f"保存参数失败: {str(e)}"
    
    def delete_parameter(self, key, username):
        """
        删除参数
        
        Args:
            key: 参数名
            username: 用户名
            
        Returns:
            tuple: (成功标志, 消息)
        """
        # 获取用户目录
        user_dir = self._get_user_dir(username)
        params_file = os.path.join(user_dir, 'parameters.json')
        
        # 读取现有参数
        parameters = self.get_all_parameters(username)
        
        # 如果参数不存在，返回失败
        if key not in parameters:
            return False, "参数不存在"
        
        # 删除参数
        del parameters[key]
        
        # 保存参数
        try:
            with open(params_file, 'w', encoding='utf-8') as f:
                json.dump(parameters, f, ensure_ascii=False, indent=2)
            
            # 生成模块文件
            self._generate_module(parameters, username)
            
            return True, "参数删除成功"
        except Exception as e:
            logging.error(f"删除用户{username}参数失败: {e}")
            return False, f"删除参数失败: {str(e)}"
    
    def _generate_module(self, parameters, username):
        """
        生成Python模块文件
        
        Args:
            parameters: 参数字典
            username: 用户名
        """
        # 获取用户目录
        user_dir = self._get_user_dir(username)
        module_file = os.path.join(user_dir, '__init__.py')
        
        # 创建模块文件内容
        content = [
            '#!/usr/bin/env python3',
            '"""',
            f'{username}的自定义参数模块',
            '此文件由系统自动生成，请勿手动修改',
            '"""',
            '',
            '# 用户自定义参数',
        ]
        
        # 添加参数定义
        for key, value in parameters.items():
            # 根据值的类型生成不同的表示方式
            if isinstance(value, str):
                # 字符串需要加引号
                value_repr = f'"{value}"'
            else:
                # 其他类型直接使用repr
                value_repr = repr(value)
            
            content.append(f'{key} = {value_repr}')
        
        # 写入模块文件
        with open(module_file, 'w', encoding='utf-8') as f:
            f.write('\n'.join(content))

# 创建一个全局实例供导入使用
parameters_manager = UserParametersManager()